package com.ww.springboot.boot.javabase.list;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 描述：
 *
 * CopyOnWriteArrayList
 * add :新增数据时 复制出一个新的数组 在其基础上新增再重新赋值给原数组
 * 作用 :读写锁分离 并发场景时 写可以不加锁 减少资源消耗
 *           读永远读的是原数组
 *           写并非是在原数组上
 *      适用于读多写少的场景
 *
 *   普通情况下 list如果要保证并发时的数据安全性 必须对读写添加锁 但对于读多写少的场景 对读添加锁 其实是很浪费资源的
 *如果能保证写的安全性 其实读的锁是可以放开的
 * CopyOnWriteArrayList 替换数组为什么是安全的？
 *    数组取值时 根据【地址】找到对应的数据并取值 即使数组在取值过程中被替换 也只是对象中的数组地址
 *
 *
 * @author 🧑 ‍wanwei
 * @since 2022-01-17 09:04
 */
public class CopyOnWriteListDemo {
    public static void main(String[] args) {
        List<String> list = new CopyOnWriteArrayList<>();

        list.add("1");
        list.add("2");

        list.forEach(str->{
            list.get(0);
            list.remove(str);
            System.out.println(list);
        });

        List<String> list2 = new ArrayList<>();
        list2.add("1");
        list2.add("2");
        System.out.println(list2);
        List<String> list3 = new CopyOnWriteArrayList<>(list2);
        list3.remove("1");

        List<String> list4 = new ArrayList<>(list2);
        list4.remove("1");

        System.out.println(list3);
        System.out.println(list4);



    }
}
